<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        #box{
            height:100px;
            width:100px;
            background-color: blueviolet;
            position: relative;
            left:0;
            top:0;
        }
    </style>
</head>
<body>
    <div id="box"></div>
    <script>
        //鼠标移入盒子，立刻按下
        let startX,startY,endX,endY;
        let html=document.documentElement||document.body;
        //最大移动的范围
        let maxW=html.clientWidth-box.offsetWidth;
        let maxH=html.clientHeight-box.offsetHeight;

        box.onmousedown=function(e){
           //初始坐标
           startX=e.offsetX;
           startY=e.offsetY;

           //鼠标必须移入到小盒子里面，全局拖动，移动的瞬间盒子位置改变
           window.addEventListener("mousemove",move);
           //先添加一个抬起事件，（抬起后，小盒子不会跟随移动）
           window.addEventListener("mouseup",up);
        }

        function move(e){
          //结束坐标
          endX=e.clientX;
          endY=e.clientY;

          let resX=endX-startX;
          let resY=endY-startY;

          //设置x轴的范围
          if(resX<0){
            resX=0;
          }
          if(resX>maxW){
            resX=maxW;
          }

          //设置y轴的范围
          resY=resY<0?0:(resY>maxH?maxH:resY);

          box.style.left=resX+"px";
          box.style.top=resY+"px";
        }

        function up(){
           //抬起的时候，跟随移动事件取消
            window.removeEventListener("mousemove",move);
            //同时抬起事件也没什么用了，也要移出（提高性能）
            window.removeEventListener("mouseup",up);
        }
    </script>
</body>
</html>